﻿#ifndef DATAFILEQUIX_H
#define DATAFILEQUIX_H

#include <QFileInfo>
#include <QFile>
#include <QString>
#include <QByteArray>
#include <QImage>
#include <QDebug>
#include <QPainter>
#include <QRgb>
#include "math.h"
#include <QBrush>
#include "stdint.h"

//#include "vectorsqrt.h"
#include "machine/comm/datadef.h"
#include "machine/comm/crc16.h"
#include "datafile/dataoperat.h"

#define QUIX_DATADIRX    (1)     // X向数据坐标与下位机坐标系统的差异
#define QUIX_DATADIRY    (1)     // Y向数据坐标与下位机坐标系统的差异
#define QUIX_DATADIRR    (-1)     // R向数据坐标与下位机坐标系统的差异

#define QUIX_SHOWDIRX    (1)     // X向显示坐标和数据坐标的差异
#define QUIX_SHOWDIRY    (-1)     // Y向显示坐标和数据坐标的差异

#define QUIX_PREVIEW_SIDE    (15)     // 留边大小
#define QUIX_PREVIEW_WIDTH   (156)   // 默认预览图区域宽度
#define QUIX_PREVIEW_HEIGHT  (164)   // 默认预览图区域高度

typedef struct tagQuixFileHead
{
    char           id[7];			                // 0x0000～0x0006; 标志:=="RICH"
    char           name[1];		                // 0x0007; 文件名
    unsigned char reserve1[6];	                // 0x0008～0x000D; 保留
    unsigned char rotateStyle;                 // 0x000E; 旋转式样
    unsigned char rotateAngle;               // 0x000F; 旋转角度
    unsigned int left;			               // 0x0010～0x0013; 左边 （中间数据后，可以修改，改变起始点，单针机）
    unsigned int front;			        // 0x0014～0x0017; 前边 （中间数据后，可以修改，改变起始点，单针机）
    unsigned int scanX;			        // 0x0018～0x001B; 缩放X （中间数据前，可以修改，单针机和多针机）
    unsigned int scanY;			        // 0x001C～0x001F; 缩放Y （中间数据前，可以修改，单针机和多针机）
    unsigned int normalStep;	                // 0x0020～0x0023; 针步大小（中间数据前，可以修改，单针机和多针机）
    unsigned int reinMode;		        // 0x0024～0x0027; 加固模式（中间数据后，可以修改，终点有跨步的才加，单针机和多针机）
    unsigned int reinNeedles;		        // 0x0028～0x002B; 加固针数（中间数据后，可以修改，终点有跨步的才加，单针机和多针机）
    unsigned int reinNum;		        // 0x002C～0x002F; 加固次数（中间数据后，可以修改，终点有跨步的才加，单针机和多针机）
    unsigned int angleCorrPosX;		// 0x0030～0x0033; 角度修正x正（中间数据后，可以修改，拐角补偿，单针机和多针机）
    unsigned int angleCorrPosY;		// 0x0034～0x0037; 角度修正y正（中间数据后，可以修改，拐角补偿，单针机和多针机）
    unsigned int angleCorrNegX;		// 0x0038～0x003B; 角度修正x负（中间数据后，可以修改，拐角补偿，单针机和多针机）
    unsigned int angleCorrNegY;		// 0x003C～0x003F; 角度修正y负（中间数据后，可以修改，拐角补偿，单针机和多针机）
    unsigned int stepQuiCorrection;		// 0x0040～0x0043; 跨步绗缝修正（中间数据后，可以修改，拐角补偿，单针机和多针机）
    int rollaComp;                                     // 0x0044～0x0047; 罗拉补偿（中间数据后，让图形闭合，可以修改，多针机）
    unsigned short angleCorrOffset;         // 0x0048～0x0049; 角度修正量  （中间数据后，可以修改，拐角补偿，单针机和多针机，新加-hhy）
    unsigned char reserve2[6];	                 // 0x004A～0x004F; 保留
    unsigned int HStep;                             // 0x0050～0x0053; 水平方向针距 单位:0.1mm（绘制用，多针机）
    unsigned int leftRightLen;	                 // 0x0054～0x0057; 左针右针距离 单位:0.1mm（绘制用，多针机）
    unsigned int VStep12;		                 // 0x0058～0x005B; 第1 2排针距 单位:0.1mm（绘制用，多针机）
    unsigned int VStep23;		                 // 0x005C～0x005F; 第2 3排针距 单位:0.1mm（绘制用，多针机）
    // 排针每个字节:XXXX XXXX
    // 针位n (0x00:无针,0x01:右针, 0x10:左针,0x11:左右针)
    unsigned char arrayNeedle1[48];	// 0x0060～0x008F; 第1排排针（绘制用，多针机）
    unsigned char arrayNeedle2[48];       // 0x0090～0x00BF; 第2排排针（绘制用，多针机）
    unsigned char arrayNeedle3[48];       // 0x00C0～0x00EF; 第3排排针（绘制用，多针机）
    unsigned int firstPullLen;			// 0x00F0～0x00F3; 一次拉料长度
    unsigned int secondPullLen;		// 0x00F4～0x00F7; 二次拉料长度
    unsigned int triplePullLen;                 // 0x00F8～0x00FB; 三次拉料长度

    //unsigned char  reserve3[4];	               // 0x00FC～0x00FF; 保留
    unsigned char cornerneedle;     //0x00FC 拐角增加针步标志
    unsigned char cutneedle;        //0x00FD 拐角分割针步标志
    unsigned char  reserve3[2];     //0x00FE-0x00FF 保留

    unsigned char  reserve4[768];	       // 0x0100～0x0400; 保留
    unsigned char  reserve5[3072];	       // 0x0401～0x1000; 保留

} __attribute__ ((packed)) QuixFileHead;

class DataFileQuix
{
public:
    DataFileQuix();

protected:
    QString m_fileFullPathName; // 文件路径
    QByteArray m_absData;    // 转换后的绝对坐标数据
    QByteArray m_fileData;// 文件数据内容（原始数据）

private:
    double m_minX;
    double m_maxX;
    double m_minY;
    double m_maxY;
    QuiPoint m_firstPoint;

private:
    void creatAbsHeadAndAr();//生成绝对坐标数据文件头及ar
    int checkFileHead();
    double getMutiUnit(int unit);

public:
    void initFile(const QString & fullPathName);
    void clear();
    void loadFile();
    void convertDataToEmbAbs(s16 falg = 1);
    int createPreviewImage(QImage * pImg = NULL, int saveflag = 0, int penwidth = 1, int reDraw = 0);  // 生成预览文件
    inline const QString & getFileFullPathName() const {return m_fileFullPathName;}   // 文件路径名称
    inline QByteArray & getEmbAbsData() {return m_absData;}           // 得到转换后的数据
    QuixFileHead *getQuixHead();
    void writePatternParaToFile(QuixFileHead *head);//将花样参数配置写到文件中
    void moveDataBeginPonit(s32 left, s32 front);//移动数据起始点

public:
    int getStitchNums();//得到数据的针数
    int getDatWidth();//得到数据的图形宽度
    int getDatHeight();//得到数据的图形高度
    int getMaxX();//得到数据最大X+
    int getMinX();//得到数据最小X-
    int getMaxY();//得到数据最大Y+
    int getMinY();//得到数据最小Y-

    inline int getDatMaxX(){return m_maxX;}//得到数据最大X+
    inline int getDatMinX(){return m_minX;}//得到数据最小X-
    inline int getDatMaxY(){return m_maxY;}//得到数据最大Y+
    inline int getDatMinY(){return m_minY;}//得到数据最小Y-

    void getQuixMinMax();
};

#endif // DATAFILEQUI_H
